package com.zhu.rtda.heap.constant;

import com.zhu.classfile.constant.ConstantInfo;
import com.zhu.classfile.constant.base.ConstantFieldrefInfo;
import com.zhu.classfile.constant.base.ConstantInterfaceMethodrefInfo;
import com.zhu.classfile.constant.base.ConstantMethodrefInfo;

/**
 * 字段和方法符号引用的公共基类（对应 Go 的 MemberRef）
 *
 * 继承自 SymRef，并增加了字段/方法的名称和描述符。
 */
public abstract class MemberRef extends SymRef {

    /**
     * 字段或方法的名称（如 "main", "value"）
     */
    protected String name;

    /**
     * 字段或方法的描述符（Descriptor）
     */
    protected String descriptor;

    /**
     * 从 class 文件的 CONSTANT_Memberref_info 结构中复制信息
     *
     * @param refInfo class 文件中的成员引用信息
     */
    protected void copyMemberRefInfo(ConstantInfo refInfo) {
        if (refInfo == null) {
            return;
        }
        if (refInfo instanceof ConstantFieldrefInfo){
            ConstantFieldrefInfo ref = (ConstantFieldrefInfo) refInfo;
            this.className = ref.getClassName();
            this.name = ref.getName();
            this.descriptor = ref.getType();
        }else if (refInfo instanceof ConstantMethodrefInfo){
            ConstantMethodrefInfo ref = (ConstantMethodrefInfo) refInfo;
            this.className = ref.getClassName();
            this.name = ref.getName();
            this.descriptor = ref.getType();
        }else if (refInfo instanceof ConstantInterfaceMethodrefInfo){
            ConstantInterfaceMethodrefInfo ref = (ConstantInterfaceMethodrefInfo) refInfo;
            this.className = ref.getClassName();
            this.name = ref.getName();
            this.descriptor = ref.getType();
        }else {
            // 不支持的类型，可抛异常或日志
            throw new IllegalArgumentException("Unsupported constant type");
        }
    }

    public String getName() {
        return name;
    }

    public String getDescriptor() {
        return descriptor;
    }
}
